// 全局变量定义
let socket = null;          // WebSocket实例
let timer = null;           // 心跳定时器
let messageCallback = null; // 消息回调函数
let initiativeClose = true;// 是否需要重连

/**
 * 创建WebSocket连接
 * @param {string} url - WebSocket服务器地址
 * @param {boolean} enableHeartbeat - 是否启用心跳检测
 */
function createWebSocket(url, enableHeartbeat,ativeClose  ) {
  initiativeClose = ativeClose;
  console.log('createWebSocket',enableHeartbeat)
  socket = new WebSocket(url);

  // 连接成功回调
  socket.onopen = function() {
    console.log('WebSocket连接成功',enableHeartbeat);
    if (enableHeartbeat) {
      startHeartbeat(); // 如果启用心跳则开始检测
    }
  };

  // 收到消息回调
  socket.onmessage = function(event) {
    messageCallback && messageCallback(event.data);
  };

  // 连接关闭回调
  socket.onclose = function() {
    console.log('WebSocket连接关闭',initiativeClose);
    if (enableHeartbeat) {
      stopHeartbeat(); // 如果启用心跳则停止检测
    }

    // 非主动断开时自动重连
    if (initiativeClose) {
      console.log('非主动断开时自动重连')
      setTimeout(() => {
        createWebSocket(url, enableHeartbeat,  true); // 重连时保持原有心跳设置
      }, 3000);
    }
  };

  // 错误处理回调
  socket.onerror = function(error) {
    console.error('WebSocket错误:', error);
  };
}

/**
 * 开始心跳检测
 * 每20秒发送一次心跳包
 */
function startHeartbeat() {
  timer = setInterval(() => {
    if (socket.readyState === 1) { // 连接状态为OPEN时发送
      socket.send(JSON.stringify('heartbeat'));
      console.log('发送心跳包');
    }
  }, 20000);
}

/**
 * 停止心跳检测
 */
function stopHeartbeat() {
  if (timer) {
    clearInterval(timer);
    timer = null;
    console.log('心跳检测已停止');
  }
}

// 导出模块
export default {
  /**
   * 连接WebSocket服务器
   * @param {string} url - 服务器地址
   * @param {function} callback - 消息回调函数
   * @param {boolean} [enableHeartbeat=true] - 是否启用心跳(默认开启)
   */
  connect(url, callback, enableHeartbeat = true,ativeClose) {
    messageCallback = callback;
    createWebSocket(url, enableHeartbeat,  ativeClose);
  },

  /**
   * 发送数据
   * @param {string | object} data - 要发送的数据（字符串或对象）
   */
  send(data) {
    if (!socket || socket.readyState !== 1) {
      console.error('WebSocket未连接，无法发送数据');
      return;
    }

    // 如果是对象，转换成JSON字符串
    const message = typeof data === 'object' ? JSON.stringify(data) : data;
    socket.send(message);
    console.log('发送数据:', message);
  },

  /**
   * 主动断开连接
   */
  disconnect() {
    initiativeClose = false; // 标记为主动断开
    console.log('主动断开WebSocket连接');
    if (socket) {
      socket.close();
    }
  }
};
